﻿using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Validation;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Security.Authorization;

namespace Sinacor.Servico.Bovespa.Parametro.BusinessLogic
{
	public class ParametroBolsa 
    {
        private const int ERRO_NUMEROULTIMANOTAOBRIGATORIO = 109247;
        private const int ERRO_TAMANHOMAXIMOCAMINHONOTA = 109374;

		public ParametroBolsa(){}

		public void AlterarParametroBolsa(BusinessEntity.ParametroBolsa entity)
        {
            this.ValidarParametroBolsa(entity);

            ResourceAccess.ParametroBolsa _resourceAccess = new Sinacor.Servico.Bovespa.Parametro.ResourceAccess.ParametroBolsa();
            _resourceAccess.AlterarParametroBolsa(entity);
		}

		public void AlterarTipoNota(BusinessEntity.TipoNota parameter)
        {
            ResourceAccess.ParametroBolsa _resourceAccess = new Sinacor.Servico.Bovespa.Parametro.ResourceAccess.ParametroBolsa();
            _resourceAccess.AlterarTipoNota(parameter);		
		}

		public void AlterarTiposNotas(List<BusinessEntity.TipoNota> entities)
        {
            foreach (BusinessEntity.TipoNota item in entities)
            {
                this.AlterarTipoNota(item);
            }
		}

		public void AtualizarParametroBolsa(BusinessEntity.ParametroBolsa entity, List<BusinessEntity.TipoNota> tiposNotasList)
        {
            this.AlterarParametroBolsa(entity);
            this.AlterarTiposNotas(tiposNotasList); 
		}

        public List<BusinessEntity.TipoNota> ConsultarTiposNotas(BusinessEntity.Parameter.FiltroTipoNota parameter)
        {
            ResourceAccess.ParametroBolsa _resourceAccess = new Sinacor.Servico.Bovespa.Parametro.ResourceAccess.ParametroBolsa();
            return _resourceAccess.ConsultarTiposNotas(parameter);		
		}

		public BusinessEntity.ParametroBolsa ObterParametroBolsa()
        {
            ResourceAccess.ParametroBolsa _resourceAccess = new Sinacor.Servico.Bovespa.Parametro.ResourceAccess.ParametroBolsa();
            return _resourceAccess.ObterParametroBolsa();		            
		}

		private void ValidarParametroBolsa(BusinessEntity.ParametroBolsa entity)
        {

            if (!entity.UltimaNotaEmitida.HasValue)
            {
                throw new BusinessException(ERRO_NUMEROULTIMANOTAOBRIGATORIO);
            }

            if (!string.IsNullOrEmpty(entity.CaminhoNota))
            {
                if (entity.CaminhoNota.Length > 150)
                {
                    throw new BusinessException(ERRO_TAMANHOMAXIMOCAMINHONOTA);
                }
            }

            if (!(new Sinacor.Servico.Bovespa.Acesso.BusinessLogic.Acesso()).VerificarSistemaInstalado("CCO")) 
            {
                entity.IntegraContasCorrentes = false;
                entity.EnviaAgente = false;
                entity.EnviaCarteira = false;
            }
		}
	}
}